package AlgebraLinear.Matriz;

public class OperacoesMatriz {

	private double A[][];
	private double B[][];
	
	private void igualarMatriz(){
		double[][] temp;
		
		int linhas = Math.max(this.A.length, this.B.length);
		int colunas = 0;		
		
		for (int i = 0; i < Math.min(this.A.length, this.B.length); i++) {
			if(colunas < Math.max(this.A[i].length, this.B[i].length)){
				colunas = Math.max(this.A[i].length, this.B[i].length);
			}
		}
		
		//Preencho com os valores de A
		temp = new double[linhas][colunas];
		for (int i = 0; i < A.length; i++) {
			for (int j = 0; j < A[i].length; j++) {
				temp[i][j] = A[i][j];
			}
		}
		A = temp;
		
		//Preencho com com os valores de B
		temp = new double[linhas][colunas];
		for (int i = 0; i < B.length; i++) {
			for (int j = 0; j < B[i].length; j++) {
				temp[i][j] = B[i][j];
			}
		}
		B = temp;
		
	}
	
	public double[][] somaMatriz(double[][] arg0, double[][] arg1){
		
		FuncoesMatriz.verificaMatriz(arg0);
		FuncoesMatriz.verificaMatriz(arg1);
		
		this.A = arg0;
		this.B = arg1;
		//Igualo as matrizes
		this.igualarMatriz();
		
		double[][] resultado = new double[this.A.length][this.A[0].length];
		
		for (int i = 0; i < resultado.length; i++) {
			for (int j = 0; j < resultado[i].length; j++) {
				resultado[i][j] = A[i][j] + B[i][j];
			}
		}
		
		this.A = null;
		this.B = null;
		
		return resultado;
	}
	
	public double[][] multiplicacaoEscalar(double escalar, double[][] matriz){
		FuncoesMatriz.verificaMatriz(matriz);
		
		double[][] resultado = new double[matriz.length][matriz[0].length];
		
		//Percorro a matriz para multiplicar cada elemnto pelo escalar
		for (int i = 0; i < resultado.length; i++) {
			for (int j = 0; j < resultado[i].length; j++) {
				resultado[i][j] = escalar*matriz[i][j];
			}
		}
		return resultado;
	}
	
	public double[][] multiplicacaoMatrizes(double[][] arg0, double[][] arg1){
		FuncoesMatriz.verificaMatriz(arg0);
		FuncoesMatriz.verificaMatriz(arg1);
		
		if(arg0[0].length != arg1.length){
			throw new IllegalArgumentException("As Matrizes informadas não podem ser multiplicadas");
		}
		
		A = arg0;
		B = arg1;
		double[][] resultado  = new double[A.length][B[0].length];
		
		for (int i = 0; i < resultado.length; i++) {
			for (int j = 0; j < resultado[i].length; j++) {
				double soma = 0;
				for (int k = 0; k < A[i].length; k++) {
					soma += A[i][k]*B[k][j];
				}
				resultado[i][j] = soma;
			}
		}
		
		return resultado;
	}
}
